package com.itheima.controller;


import cn.itheima.health.service.SetMealService;
import com.itheima.constant.MessageConstant;
import com.itheima.constant.RedisConstant;
import com.itheima.healt.entlty.Result;
import com.itheima.pojo.Setmeal;
import com.itheima.utils.QiniuUtils;
import com.itheima.utils.UploadUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.io.IOException;

@RestController   // @   固定写法：    RestController     控制 是相应Js 格式  区别于 普通的 @Controller
@RequestMapping("/setmeal")
public class SetMealController {

    @Autowired
    private JedisPool jedisPool;


    @Reference
    private SetMealService setMealService;

    @RequestMapping("/upload.do")
    public Result upload(@RequestParam("imgFile") MultipartFile file) {
        //  文件上传到 9001 服务器
        try {
            if (!file.isEmpty()) {
                //生成一个文件的名称
                String originalFilename = file.getOriginalFilename();// xxxxx.jpg
                String filename = UploadUtils.generateRandonFileName(originalFilename);
                // 先将文件改成Bytes 数组形式 然后使用 工具类 上传到七牛云
                QiniuUtils.upload2Qiniu(file.getBytes(), filename);

              // getResource: 获取资源

/*       --------------- 1. 需要在Web 控制者 中 方法执行完毕前       这里插入   任务调度  每隔一段时间该方法执行一次            ---------------       */

                Jedis resource = jedisPool.getResource();
                     // 注意；  这里的 key 不能乱写 需要引入RedisConstant中的常量
                //图片保存在 Redis 缓存中
                resource.sadd(RedisConstant.SETMEAL_PIC_RESOURCES,filename);
                resource.close();//关流

                /*       ---------------      这里插入   任务调度  每隔一段时间该方法执行一次            ---------------       */

                //这里需要将 filename ： 文件 的名字，域名 加上文件的名字 就能找到 该图片
                return new Result(true, MessageConstant.PIC_UPLOAD_SUCCESS,filename);
            }else {
                return new Result(false,MessageConstant.PIC_UPLOAD_FAIL);
            }
        } catch (IOException e) {
            e.printStackTrace();
            return new Result(false,MessageConstant.PIC_UPLOAD_FAIL);
        }


    }


    @RequestMapping("/add.do")
    /*
    *     Result  这里为什么需要一个 Result 类型的返回值   因为我们返还给前台的数据  可以调用 Result.参数.的形式获取数据
    *     @RequestBody   请求正文   表示封装的  请求多个参数  Setmeal setmeal， 就表示 套餐中的 各种数据 Key ，也表示需
    *                                                           要到数据库中查询得到的数据
    *     @RequestParam   请求参数  表示  单个请求的参数    checkgroupIds 表示： 到Sql 语句后端 通过 检查组ID 查询的值
    *                                                       为什么是int 类型  因为 需要   与数据库的实体类 类型一致
    *      这里传入 一个  Setmeal setmeal  实体类对象 是为了 后面可以 通过这实体类对象 获得 相应的Id  ，然后再Sql 中 通过这Id 查询到相应的数据
    */
    public Result add(@RequestBody Setmeal setmeal, @RequestParam("checkgroupIds") int[] checkgroupIds){
        try {
            setMealService.add(setmeal,checkgroupIds);
            return  new Result(true, MessageConstant.ADD_SETMEAL_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return  new Result(false, MessageConstant.ADD_SETMEAL_FAIL);
        }
    }
}
